import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store/index.js'
import router from '@/router/index.js'

const axiosInstance = axios.create({
  baseURL: 'http://interview-api-t.itheima.net/',
  // 超时时间：请求发出去后，过了这么久还没响应，就认为请求失败，抛出错误
  // 注意：并不是等这么久再发出请求
  timeout: 5000
})

// ========= 请求拦截器（逆序）============
axiosInstance.interceptors.request.use(config => {
  // 统一注入 token 请求头（有 token 才需要添加）
  const token = store.state.user.token
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }

  // 注意：必须返回请求配置对象
  return config
})

// ========= 响应拦截器（正序）============
// 简化响应数据
axiosInstance.interceptors.response.use(res => res.data)

// token 过期处理
axiosInstance.interceptors.response.use(undefined, err => {
  if (err.response.status === 401) {
    // 1. 提示
    // 2. 删除token
    // 3. 跳登录页
    // 4. 中断后面的拦截器

    Message.error('尊敬的用户，登录状态已过期！')
    store.commit('user/setToken', '')
    router.push({ name: 'LoginPage' })
    return new Promise(() => {})
  }
  // 如果不是 401 错误，那么这个拦截器就管不着，交给下一个拦截器处理
  return Promise.reject(err)
})

// 统一的错误消息提示
axiosInstance.interceptors.response.use(undefined, err => {
  Message.error(err.response.data.message)
  // 要让后续的操作继续错误，所以 return 一个失败的 Promise
  return Promise.reject(err)
})

export default axiosInstance
